/**************************************************************************************
 *
 * @(#) ImageUtils.java
 * @Package com.jgdt.jgdtkasannong_university_gene_backend.utils
 **************************************************************************************/
package com.jgdt.jgdtkasannong_university_gene_backend.utils.excel;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.jgdt.jgdtkasannong_university_gene_backend.config.enums.FilePatternsEnums;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

/**
 * @description:
 * @author: huangAn
 * @createDate: 2025/04/29
 */
@Slf4j
public class ImageUtils {

    // 支持的图片格式
    private static final List<String> SUPPORTED_IMAGE_TYPES = Arrays.asList(
            "image/jpeg", "image/png", "image/gif", "image/bmp", "image/webp"
    );

//    /**
//     * 存储图片到服务器，根据菜单id对应存储到相应目录
//     * @param imageData
//     * @return 文件目录，文件访问url
//     * @throws IOException
//     */
//    public static String  saveImageToServer(byte[] imageData,Integer menuId) throws IOException {
//        // 检测图片格式（示例简略实现）
//        String fileExtension = ".png";
//        if (imageData.length > 3 && imageData[0] == (byte)0xFF && imageData[1] == (byte)0xD8) {
//            fileExtension = ".jpg";
//        }
//
//        // 生成唯一文件名
//        String fileName = UUID.randomUUID() + fileExtension;
//        String tempImgCatalogue=sysValueSetService.queryPriorityValueByCode(SysValueSetEnums.TEMP_IMG_CATALOGUE.getCode());
//        Path savePath = Paths.get(tempImgCatalogue+ TemplateCodeEnums.getById(menuId).getImportUrl(), fileName);
//
//        // 确保目录存在并保存文件
//        Files.createDirectories(savePath.getParent());
//        Files.write(savePath, imageData);
//
//        // 返回访问 URL（需配置服务器静态资源映射）
//        return String.valueOf(savePath);
//    }

    /**
     * 检查文件是否为图片
     * @param file 上传的文件
     * @return 是否是图片
     */
    public static boolean isImage(MultipartFile file) {
        String contentType = file.getContentType();
        return contentType != null && SUPPORTED_IMAGE_TYPES.contains(contentType.toLowerCase());
    }

    /**
     * 保存图片到服务器
     * @param imageFile 图片文件
     * @param uploadDir 上传目录
     * @return 保存后的文件路径
     * @throws IOException
     */
    public static String saveImage(MultipartFile imageFile, String uploadDir) throws IOException {
        // 确保上传目录存在
        Path uploadPath = Paths.get(uploadDir);
        if (!Files.exists(uploadPath)) {
            Files.createDirectories(uploadPath);
        }

        // 生成唯一文件名
        String originalFilename = imageFile.getOriginalFilename();
        String fileExtension = originalFilename != null ?
                originalFilename.substring(originalFilename.lastIndexOf(".")) : ".jpg";
        String uniqueFilename = UUID.randomUUID().toString() + fileExtension;

        // 保存文件
        Path filePath = uploadPath.resolve(uniqueFilename);
        Files.copy(imageFile.getInputStream(), filePath);

        return filePath.toString();
    }


    /**
     * 获取图片信息
     * @param imageFile 图片文件
     * @return 包含宽度和高度的数组 [width, height]
     * @throws IOException
     */
    public static int[] getImageDimensions(MultipartFile imageFile) throws IOException {
        BufferedImage image = ImageIO.read(imageFile.getInputStream());
        if (image == null) {
            throw new IOException("无法读取图片");
        }
        return new int[]{image.getWidth(), image.getHeight()};
    }

    /**
     * 生成缩略图
     * @param sourcePath 源图片路径
     * @param targetPath 目标缩略图路径
     * @param width 目标宽度
     * @param height 目标高度
     * @throws IOException
     */
    public static void generateThumbnail(String sourcePath, String targetPath, int width, int height) throws IOException {
        BufferedImage originalImage = ImageIO.read(new File(sourcePath));
        BufferedImage thumbnail = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        thumbnail.createGraphics().drawImage(
                originalImage.getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH),
                0, 0, null);
        ImageIO.write(thumbnail, "jpg", new File(targetPath));
    }

    /**
     * 获取启动服务ip地址
     *
     * @return
     */
    public static String getLocalIP() {
        try {
            return InetAddress.getLocalHost().getHostAddress();  // 获取本机IP地址
        } catch (UnknownHostException e) {
            log.error("getLocalIP,err" + e.getMessage());
            return "127.0.0.1";  // 异常返回本地回环地址
        }
    }

    /**
     * 获取字符串最后一个/后字符串
     * @param str
     * @return
     */
    public static String getAfterLastSlash(String str, String delimiter,String code) {
//        String code = FilePatternsEnums.getEnumsByIsEnable().getCode();
        int n = 0;
        if (FilePatternsEnums.WIDOS.getCode().equals(code)) {
            n = 1;
        } else if (FilePatternsEnums.LINX.getCode().equals(code)) {
            n = 2;
        } else {
            log.warn("getAfterLastSlash warn:配置文件FilePatternsEnums.java有问题");
        }
        if (str == null || str.isEmpty() || n <= 0 || StringUtils.isEmpty(delimiter)) {
            log.warn("getAfterLastSlash warn:str 为空");
            return "";
        }
        StringBuilder result = new StringBuilder();
        try {
            String[] parts = str.split(delimiter);
            if (parts.length < n) {
                log.warn("getAfterLastSlash warn:str 格式不符合要求");
                return str; // 如果分割后的部分少于n个，返回整个字符串
            }
            for (int i = parts.length - n; i < parts.length; i++) {
                if (i > parts.length - n) {
                    result.append(delimiter);
                }
                result.append(parts[i]);
            }
        } catch (Exception e) {
            log.error("getAfterLastSlash err:" + e.getMessage());
        }
        return result.toString();
    }

}




